//
//  SlideUnlimitedView.m
//  SlideUnlimited(无限滑动)
//
//  Created by mac on 16/7/14.
//  Copyright © 2016年 www. All rights reserved.
//

#import "SlideUnlimitedView.h"

#define kWidth self.bounds.size.width
#define kHeight self.bounds.size.height


@implementation SlideUnlimitedView 

//覆写初始化方法
- (instancetype)initWithFrame:(CGRect)frame {
    
    self = [super initWithFrame:frame];
    if (self) {
        
        //创建scrollview
        [self _createScrollView];
        
        //创建UIPAgeView
        [self _createPageControl];
        
        //创建定时器
        [self _createTimer];
    }
    
    return self;
}

//创建scrollview
- (void)_createScrollView{
    //滑动视图创建
    _scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, kWidth, kHeight)];
    
    //属性设置
    //设置bounces = NO，防止回弹(自带动画)
    _scrollView.bounces = NO;
    //分页效果
    _scrollView.pagingEnabled = YES;
    //隐藏水平滚动条
    _scrollView.showsHorizontalScrollIndicator = NO;
    //滑动视图签订代理协议,设置代理对象
    _scrollView.delegate = self;
    //第一次显示原数组的第一张图片
    _scrollView.contentOffset = CGPointMake(kWidth, 0);
    
    //添加显示 scrollview
    [self addSubview:_scrollView];
    
}

//创建 UIPageControl
- (void)_createPageControl{
    
    _pagecontrol = [[UIPageControl alloc]initWithFrame:CGRectMake(0, kHeight * .85, kWidth, kHeight * .15)];
    
    _pagecontrol.currentPage = 0;
    
    [self addSubview:_pagecontrol];
}

- (void)_createTimer {
    
    //-----------精准定时器(PrecisionTimer)------------
    /*
     其原理是利用屏幕每秒刷新60次,也就是频率为60HZ,将方法与其绑定,就可以形成一个精准定时器,他的时间是由硬件提供的,所以比较准确.(每刷新一次为一帧)
     */
    //创建显示链接对象
    CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(timerAction)];
    //每多少帧链接一次
    link.frameInterval = 60 * 5;//60帧链接一次就相当于1秒链接一次
    //将显示链接对象添加到RunLoop中
    /*
     forMode:有两种类型1.> NSDefaultRunLoopMode(串行在主线程,会受线程的其他程序阻塞(优先级比较低)); 2.>NSRunLoopCommonModes(并行在主线程,不受线程其他程序影响)
     */
    [link addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
}

//定时器响应方法
- (void)timerAction {
    
    NSInteger i = (NSInteger)_scrollView.contentOffset.x / kWidth;
    
    if (i == 0) {
        _scrollView.contentOffset = CGPointMake((_imageArray.count - 2) * kWidth, 0);
    }
    
    if (i == (_imageArray.count - 1)) {
        
        _scrollView.contentOffset = CGPointMake(kWidth , 0);
    }
    
    [_scrollView setContentOffset:CGPointMake((i + 1) * kWidth, 0) animated:YES];
    
    
    //根据偏移量判断分页视图要显示第几个点
    if ((i + 1) == (_imageArray.count - 1)) {
        //如果滑动视图到达了最后一个image,则让分页视图显示第一个,因为此时图片也就是原始图片数组中的第一张图片
        _pagecontrol.currentPage = 0;
        
        //如果滑动视图到达了最后一个image,让滑动视图偏移量改变到新图片数组中的第二张,图片是一样的,位置不一样,可以继续循环
        _scrollView.contentOffset = CGPointMake(0 , 0);
        
    }else{
        
        //滑动视图只有最后一张和第一张比较特殊,其他就比较正常了
        _pagecontrol.currentPage = i;
    }
    
    //标记当前显示的图片在原始数组中的下标
    _index = _pagecontrol.currentPage;
    
    
}

//获取图片数组,并为 scrollview 和 UIPageControl 赋值
- (void)setImageArray:(NSArray *)imageArray {
    
    //判断数组中存放的是否为网址
    if ([[imageArray firstObject] isKindOfClass:[NSString class]]) {
        
        NSMutableArray *tempArray = [NSMutableArray array];
        
        for (int i = 0; i < imageArray.count; i++) {
                
            NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageArray[i]]];
            UIImage *image = [UIImage imageWithData:data];
            [tempArray addObject:image];
            
        }
        
        imageArray = tempArray;
    }
    
    
    NSMutableArray *mImageArray = [imageArray mutableCopy];
    
    //将最后一张图片 copy 一份放到最前头
    [mImageArray insertObject:[imageArray lastObject] atIndex:0];
    //将原始图片数组中第一张 copy 一份放到最后头
    [mImageArray addObject:[imageArray firstObject]];
    
    _imageArray = mImageArray;
    
    //图片总数
    NSInteger count = _imageArray.count;
    
    //设置分页视图参数(减去头尾)
    _pagecontrol.numberOfPages =  count - 2;
    
    //设置滑动视图参数
    _scrollView.contentSize = CGSizeMake(count * kWidth, kHeight);
    
    //for 循环将图片添加到
    for (int i = 0 ; i<count ; i++ ) {
        
        UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(i * kWidth, 0, kWidth, kHeight)];
        
        imageView.image = _imageArray[i];
        
        [_scrollView addSubview:imageView];
    }
    
    //添加手势到滑动视图上
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapAction)];
    
    [_scrollView addGestureRecognizer:tap];
    
}

- (void)tapAction{
    //创建视图控制器
    
    //拿到当前图片
    
    //获取导航控制器
    
    //PUSH 操作
    
}

#pragma mark -------UIScrollViewDelegate----------
//滑动结束的时候调用这个方法
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    
    //滑动视图的偏移量
    NSInteger i = (NSInteger)scrollView.contentOffset.x / kWidth;
    //根据偏移量判断分页视图要显示第几个点
    if (i == (_imageArray.count - 1)) {
        //如果滑动视图到达了最后一个image,则让分页视图显示第一个,因为此时图片也就是原始图片数组中的第一张图片
        _pagecontrol.currentPage = 0;
        
        //如果滑动视图到达了最后一个image,让滑动视图偏移量改变到新图片数组中的第二张,图片是一样的,位置不一样,可以继续循环
        _scrollView.contentOffset = CGPointMake(kWidth, 0);
        
    }else if(i == 0){
        //如果滑动视图到达了第一个image,则让分页视图显示最后一个,因为此时图片也就是原始图片数组中的最后一张图片
        _pagecontrol.currentPage = _imageArray.count - 3;
        
        //如果滑动视图到达了第一个image,让滑动视图偏移量改变到新图片数组中的倒数第二张,图片是一样的,位置不一样,可以继续循环
        _scrollView.contentOffset = CGPointMake((_imageArray.count - 2) * kWidth, 0);
        
    }else{
        
        //滑动视图只有最后一张和第一张比较特殊,其他就比较正常了
        _pagecontrol.currentPage = i - 1;
    }
    
    //标记当前显示的图片在原始数组中的下标
    _index = _pagecontrol.currentPage;
    
}


@end
